package controlador;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.List;

import javax.swing.JOptionPane;

import dto.*;
import interfaces.InterfazRemotaAdministracion;

public class ControladorAC {

	// Interfaz Remota que esta en el Repositorio
	InterfazRemotaAdministracion objetoRemoto;
	private static ControladorAC instancia;

	// Implemento Sigleton para que sea mas facil hacer las llamadas desde las
	// vistas
	private ControladorAC() {
		getStub();
	}

	public static ControladorAC getInstancia() {
		if (instancia == null)
			instancia = new ControladorAC();
		return instancia;
	}

	public boolean getStub() {

		try {
			// Establezco el lugar a donde el cliente va a hacer el lookup para
			// conectarse con el server
			objetoRemoto = (InterfazRemotaAdministracion) Naming
					.lookup(InterfazRemotaAdministracion.url);
			System.out.println("Obtenido el servicio de la Instancia Remota "
					+ InterfazRemotaAdministracion.url);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	// Aca van todos los metodos llamando los metodos de la interface

	public void altaSucursal(String nombre) {

		SucursalDTO s = new SucursalDTO();
		s.setNombre(nombre);

		try {
			objetoRemoto.altaSucursal(s);
		} catch (RemoteException e) {
			// Mensaje indicando la excepcion que se tomo del SucursalManager.
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}

	}

	// MM
	public void altaProductoENV(String nombre, String caducidad, int precio) {
		ElaboradoNoVentaDTO p = new ElaboradoNoVentaDTO();
		p.setNombre(nombre);
		p.setCaducidad(caducidad);
		p.setPrecio(precio);

		try {
			objetoRemoto.altaProductoENV(p);
		} catch (RemoteException e) {
			// Mensaje indicando la excepcion que se tomo del ProductoManager.
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}

	}

	public void altaProductoEV(String nombre, String caducidad, int precio) {
		ElaboradoVentaDTO p = new ElaboradoVentaDTO();
		p.setNombre(nombre);
		p.setCaducidad(caducidad);
		p.setPrecio(precio);
		try {
			objetoRemoto.altaProductoEV(p);
		} catch (RemoteException e) {
			// Mensaje indicando la excepcion que se tomo del SucursalManager.
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
	}

	public void altaProductoCNV(String nombre, String caducidad, int precio) {
		CompraNoVentaDTO p = new CompraNoVentaDTO();
		p.setNombre(nombre);
		p.setCaducidad(caducidad);
		p.setPrecio(precio);
		try {
			objetoRemoto.altaProductoCNV(p);
		} catch (RemoteException e) {
			// Mensaje indicando la excepcion que se tomo del SucursalManager.
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}

	}

	public void altaProductoCV(String nombre, String caducidad, int precio) {
		CompraVentaDTO p = new CompraVentaDTO();
		p.setNombre(nombre);
		p.setCaducidad(caducidad);
		p.setPrecio(precio);

		try {
			objetoRemoto.altaProductoCV(p);
		} catch (RemoteException e) {
			// Mensaje indicando la excepcion que se tomo del ProductoManager.
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
	}

	public List<RecetaDTO> listarRecetas() {
		List<RecetaDTO> lista = null;
		try {
			lista = objetoRemoto.listarRecetas();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}
	public List<SucursalDTO> listarSucursales() {
		List<SucursalDTO> lista = null;
		try {
			lista = objetoRemoto.listarSucursales();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}
	public List<RubroCartaDTO> listarRubros() {
		List<RubroCartaDTO> lista = null;
		try {
			lista = objetoRemoto.listarRubros();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}
	public List<PlatoDTO> listarPlatos() {
		List<PlatoDTO> lista = null;
		try {
			lista = objetoRemoto.listarPlatos();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}	
	// Fin MM
	
	public void altaBarra(SucursalDTO s, BarraDTO b){
		try {
			objetoRemoto.altaBarra(s,b);
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
	}

	public List<TareaDTO> listarTareasActivas() {
		List<TareaDTO> lista = null;
		try {
			lista = objetoRemoto.listarTareasActivas();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}

	public List<SucursalDTO> calcularOcupacionSucursales(List<SucursalDTO> sucursales) {
		
		try {
			sucursales = objetoRemoto.calcularOcupacionSuc(sucursales);
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return sucursales;
	}

	public int getNumeroPlanProduccion() {
		PlanProduccionDTO plan = null;
		try {
			plan = objetoRemoto.getPlanProduccion();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		
		if(plan != null){
			return plan.getIdPlanProduccion();
		}else{
			return 0;
		}
		
	}

	public Date getFechaPP() {
		PlanProduccionDTO plan = null;
		try {
			plan = objetoRemoto.getPlanProduccion();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		
		if(plan != null){
			return plan.getFecha();
		}else{
			return new Date();
		}
		
	}

	public List<ProductoDTO> listarProductosElaborados() {
		List<ProductoDTO> lista = null;
		try {
			lista = objetoRemoto.listarProductosElaborados();
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return lista;
	}

	public boolean altaTarea(EmpleadoDTO e2, SucursalDTO suc, ProductoDTO prod, int cantidad,
			String estado, int horasRequeridas) {
		
		boolean resp = false;
		
		TareaDTO t = new TareaDTO();
		t.setCantidad(cantidad);
		t.setEstado(estado);
		t.setTiempoRequerido(horasRequeridas);
		t.setProducto(prod);
		t.setSucursal(suc);

		
		try{
			resp = objetoRemoto.altaTarea(e2,t);
			
		}catch(RemoteException e){
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		
		return resp;
		
	}

	public EmpleadoDTO validarUsuarioAdmin(String usuario, String password) {
		EmpleadoDTO emp = null;
		
		try {
			
			emp = objetoRemoto.validarUsuarioAdmin(usuario,password);
			
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null, e.getCause().getMessage());
		}
		return emp;
	}
	
}
